Monte Carlo
π― Monte Carloβ
The CSharpNumerics.Statistics.MonteCarlo namespace provides a general-purpose Monte Carlo simulation engine.
using CSharpNumerics.Statistics.MonteCarlo;
π Quick Start β Estimate β
var sim = new MonteCarloSimulator(seed: 42);
var result = sim.Run(rng =>
{
double x = rng.NextUniform(0, 1);
double y = rng.NextUniform(0, 1);
return x * x + y * y <= 1.0 ? 1.0 : 0.0;
}, iterations: 1_000_000);
double piEstimate = result.Mean * 4.0; // β 3.1416
β« Monte Carlo Integrationβ
// β«β^Ο sin(x) dx = 2
var result = sim.IntegrateUniform(Math.Sin, a: 0, b: Math.PI, iterations: 500_000);
// result.Mean β 2.0
// E[XΒ²] where X ~ N(0,1) β should be β 1.0
var normal = new NormalDistribution(0, 1);
var result2 = sim.Integrate(x => x * x, normal, iterations: 200_000);
π§© Custom Models via IMonteCarloModelβ
public class TwoDiceModel : IMonteCarloModel
{
public double Evaluate(RandomGenerator rng)
{
return rng.NextInt(1, 7) + rng.NextInt(1, 7);
}
}
var result = sim.Run(new TwoDiceModel(), iterations: 200_000);
// result.Mean β 7.0
π Result Analysisβ
MonteCarloResult provides descriptive statistics, percentiles, histograms and probability queries:
result.Mean // Sample mean
result.Variance // Sample variance (n-1)
result.StandardDeviation // βVariance
result.StandardError // Ο / βn (precision of estimate)
result.Median // 50th percentile
result.Min / result.Max
result.Percentile(95); // 95th percentile
result.ConfidenceInterval(0.95); // (lower, upper) from empirical percentiles
result.Probability(x => x > 10); // Fraction of samples satisfying predicate
var histogram = result.Histogram(bins: 20); // (binCenter, count)[]
π Multivariate & Convergenceβ
// Multiple outputs per trial
var results = sim.RunMultivariate(rng => new[]
{
rng.NextGaussian(0, 1),
rng.NextGaussian(10, 2)
}, iterations: 100_000);
// results[0].Mean β 0, results[1].Mean β 10
// Track running mean to verify convergence
double[] curve = sim.ConvergenceCurve(
rng => rng.NextGaussian(5.0, 1.0), iterations: 50_000);